<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<script>
	function extendCopy(p) {
		var c = {};
		for(var i in p){
			c[i] = p[i]
		}
		c.uber = p;
		return c;
	}

	function object(o){
		function F() {};
		F.prototype = o;
		return new F();
	}

	// 如果我们需要访问uber属性，可以继续object函数，具体如下
	function object(o) {
		var n;
		function F() {};
		F.prototype = o;
		n = new F();
		n.uber = o;
		return n;
	}

	var shape = {
		name: 'Shape',
		toString: function() {
			return this.name;
		}
	};

	var twoDee = extendCopy(shape);
	twoDee.name = '2D shape';
	twoDee.toString = function(){
		return this.user.toString() + ', ' + this.name;
	}

	// 这个函数的使用与extendCopy()基本相同，我们只需要将某个对象传递给他，并由此创建一个新对象。然后在对新对象进行后续的扩展处理
	var triangle = object(twoDee);
	triangle.name = 'triangle';
	triangle.getArea = function() {
		return this.side * this.height / 2;
	}

	// 新的triangle对象的行为依然不变
	console.log(triangle.toString());

	// 这种模式也被称为原型继承，因为在这里，我们将父级对象设置成了子对象的原型。这个object()函数被es5所采纳，并且更名为Object.create()。例如
	var square = Object.create(triangle);
</script>
</body>
</html>